'use strict'

class content {

  constructor () {
    //param默认就是/:id，若要改变路由，则可以设置此属性，比如设置为/:name
    //this.param = '/:id'
  }

  //以下方法，若不需要，要去掉，避免无意义的路由。

  //获取资源具体内容
  //对应路由 GET '/content/:id'
  async get (c) {
    let sqltext='SELECT * FROM content WHERE id=$1';
    let r=await c.service.psql.query(sqltext,[c.param.id]);
    if(r.rowCount==0){  //r.rowCount表示查询到的数据的条数
        return c.status(404).send('content not found')
    }
    c.send(r.rows[0]);
    //不需要psql.end(),因为客户端请求不断，就需要服务器不断地从数据库获取数据，所以连接池不能关

    /* 注意：send函数只是设置ctx.res.body属性的值。
       和直接进行ctx.res.body赋值没有区别，只是因为函数调用如果出错会更快发现问题，
       而设置属性值写错了就是添加了一个新的属性，不会报错但是请求不会返回正确的数据。*/
  }

  //创建资源
  //对应路由 POST '/content'
  async post (c) {
    try{
      //提交的Body数据通过从c.body获取
      let data=JSON.parse(c.body);
      let sqltext=`INSERT INTO content(id,add_time,detail,title,update_time) VALUES($1,$2,$3,$4,$5)`;

      //生成唯一ID
      let id=c.helper.makeId();//在连续大量的获取一个随机数时保证生成不一样的数据
      let tm=Date.now();
      let r=await c.service.psql.query(sqltext,[id,tm,data.detail,data.title,tm]);
      if(r.rowCount==0){ //r.rowCount表示成功插入数据的条数
          return c.status(404).send('failed');
      }
      c.send(id);
    }catch(err){
      c.status(404).send('it is not json data')
    }
  }

  //获取内容列表
  //对应路由 GET '/content'
  async list (c) {
    //通过psql连接池去数据库端拿取数据
    //psql只对外提供query这一个接口，第一个参数为要进行的操作的字符串，第二个参数为需要传入的值，如果不需要传入值，就不用写
    let ret=await c.service.psql.query(`select * from content`);
    c.send(ret.rows);  // ret.rows为query中的操作获取到的数据
  }

  //删除资源
  //对应路由 DELETE '/content/:id'
  async delete (c) {
    try{
      let delId=c.param.id;
      let sqltext=`delete from content where id=$1`;
      let r=await c.service.psql.query(sqltext,[delId]);
      if(r.rowCount==1){
          c.send(`delete ${delId} success -- ${r.rowCount}`);
      }
    }catch(err){
      c.status(404).send('delete failed');
    }
  }

  //在文件中添加中间件的形式，只对该文件中的路由起作用
  __mid () {
    return [
      {
        name : 'token-verify',
        path : ['post', 'delete']
      }
    ]
  }

}

module.exports = content
